import globals from 'globals'
import pluginJs from '@eslint/js'
import tseslint from 'typescript-eslint'
import pluginReact from 'eslint-plugin-react'
import antfu from 'eslint-config-antfu'

/** @type {import('eslint').Linter.Config[]} */
export default [
  antfu,
  { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] },
  { languageOptions: { globals: globals.browser } },
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  pluginReact.configs.flat.recommended,
  {
    rules: {
      /** 可以出现any类型 */
      '@typescript-eslint/no-explicit-any': 'off',
      /** 需要分号 */
      // semi: ['error', 'always'],
      /** 可以使用require */
      '@typescript-eslint/no-require-imports': 'off',
      eqeqeq: ['error', 'always', { null: 'ignore' }], // 强制用 === 而不是 ==, 除了 == null 是允许的
      'require-await': 'error', // async 函数内一定要有 await
      'no-constant-condition': ['error', { checkLoops: false }], // 不允许 if(true)，但是 white(true) 可以
      '@typescript-eslint/no-empty-function': 'warn', // 当函数没有内容时会警示
      /** 可以用ts-ignore */
      '@typescript-eslint/ban-ts-comment': 'off',
      /**
       * 不检查以下划线开头的 未使用的变量
       * 包含了参数变量，解构变量，catch中的参数变量
       */
      '@typescript-eslint/no-unused-vars': [
        'error',
        {
          argsIgnorePattern: '^_',
          caughtErrorsIgnorePattern: '^_',
          destructuredArrayIgnorePattern: '^_'
        }
      ],
      'no-restricted-globals': [
        // 不允许直接用 global，必须加上 prefix window.setTimeout 这样。
        'error',
        'localStorage',
        'location',
        'alert',
        'setTimeout',
        'clearTimeout',
        'setInterval',
        'clearInterval',
        'requestAnimationFrame',
        'cancelAnimationFrame',
        'navigator'
      ]
    }
  },
  {
    ignores: [
      'config/',
      'build/',
      'public/',
      'scripts/',
      'mock/',
      '.vscode/',
      'src/utils/XMLToJson.js',
      '**/*.test.js'
    ]
  }
]
